{
  "cells": [
    {
      "cell_type": "code",
      "source": [
        "!pip install wfdb"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "mAnSEUNMC4HX",
        "outputId": "a4daddd8-db21-43fd-8c4f-d9c3a7d61b67"
      },
      "execution_count": 50,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: wfdb in /usr/local/lib/python3.11/dist-packages (4.2.0)\n",
            "Requirement already satisfied: matplotlib>=3.2.2 in /usr/local/lib/python3.11/dist-packages (from wfdb) (3.10.0)\n",
            "Requirement already satisfied: numpy>=1.26.4 in /usr/local/lib/python3.11/dist-packages (from wfdb) (1.26.4)\n",
            "Requirement already satisfied: pandas>=2.2.3 in /usr/local/lib/python3.11/dist-packages (from wfdb) (2.2.3)\n",
            "Requirement already satisfied: requests>=2.8.1 in /usr/local/lib/python3.11/dist-packages (from wfdb) (2.32.3)\n",
            "Requirement already satisfied: scipy>=1.13.0 in /usr/local/lib/python3.11/dist-packages (from wfdb) (1.13.1)\n",
            "Requirement already satisfied: soundfile>=0.10.0 in /usr/local/lib/python3.11/dist-packages (from wfdb) (0.13.1)\n",
            "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (1.3.1)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (0.12.1)\n",
            "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (4.56.0)\n",
            "Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (1.4.8)\n",
            "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (24.2)\n",
            "Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (11.1.0)\n",
            "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (3.2.1)\n",
            "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (2.8.2)\n",
            "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas>=2.2.3->wfdb) (2025.1)\n",
            "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas>=2.2.3->wfdb) (2025.1)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests>=2.8.1->wfdb) (3.4.1)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests>=2.8.1->wfdb) (3.10)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests>=2.8.1->wfdb) (2.3.0)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests>=2.8.1->wfdb) (2025.1.31)\n",
            "Requirement already satisfied: cffi>=1.0 in /usr/local/lib/python3.11/dist-packages (from soundfile>=0.10.0->wfdb) (1.17.1)\n",
            "Requirement already satisfied: pycparser in /usr/local/lib/python3.11/dist-packages (from cffi>=1.0->soundfile>=0.10.0->wfdb) (2.22)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.7->matplotlib>=3.2.2->wfdb) (1.17.0)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# prompt: code to mount drive\n",
        "\n",
        "from google.colab import drive\n",
        "drive.mount('/content/drive')\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "yhdvmWd0uX0t",
        "outputId": "12a7c94c-07ab-44b4-b5f9-373a2c7db561"
      },
      "execution_count": 51,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install pyts\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "8N96_pX-uzVA",
        "outputId": "30f4cd35-67fb-477b-c81a-095dd0ca078e"
      },
      "execution_count": 52,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: pyts in /usr/local/lib/python3.11/dist-packages (0.13.0)\n",
            "Requirement already satisfied: numpy>=1.22.4 in /usr/local/lib/python3.11/dist-packages (from pyts) (1.26.4)\n",
            "Requirement already satisfied: scipy>=1.8.1 in /usr/local/lib/python3.11/dist-packages (from pyts) (1.13.1)\n",
            "Requirement already satisfied: scikit-learn>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from pyts) (1.6.1)\n",
            "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.11/dist-packages (from pyts) (1.4.2)\n",
            "Requirement already satisfied: numba>=0.55.2 in /usr/local/lib/python3.11/dist-packages (from pyts) (0.61.0)\n",
            "Requirement already satisfied: llvmlite<0.45,>=0.44.0dev0 in /usr/local/lib/python3.11/dist-packages (from numba>=0.55.2->pyts) (0.44.0)\n",
            "Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn>=1.2.0->pyts) (3.5.0)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import pyts\n",
        "print(pyts.__version__)\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "4Ec_ADk-u3WV",
        "outputId": "bb25a7eb-1a57-4d5c-fad8-cedd42cdc448"
      },
      "execution_count": 53,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "0.13.0\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from mpl_toolkits.axes_grid1 import ImageGrid\n",
        "from pyts.image import GramianAngularField, MarkovTransitionField\n",
        "from pyts.datasets import load_gunpoint\n",
        "from sklearn.metrics.pairwise import cosine_similarity\n",
        "from sklearn.metrics.pairwise import pairwise_distances\n",
        "from sklearn.utils import resample\n",
        "from imblearn.combine import SMOTETomek\n",
        "from imblearn.over_sampling import SMOTE\n",
        "from imblearn.under_sampling import TomekLinks, NearMiss\n",
        "from sklearn.model_selection import train_test_split"
      ],
      "metadata": {
        "id": "KYeqjJwWuiSK"
      },
      "execution_count": 54,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "import torch.optim as optim\n",
        "import torchvision\n",
        "from torchvision import datasets, transforms\n",
        "from torch.utils.data import DataLoader, Dataset,TensorDataset"
      ],
      "metadata": {
        "id": "R5Lw4PDGvPYl"
      },
      "execution_count": 55,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from matplotlib import colors\n",
        "from IPython import display\n",
        "import os\n",
        "from torch.utils.data.dataset import Dataset\n",
        "from matplotlib.pyplot import imread\n",
        "import glob\n",
        "import os\n",
        "import random\n",
        "from sklearn.preprocessing import LabelEncoder\n",
        "\n",
        "from torchvision.models import alexnet, vgg16, resnet152, resnet18, vgg19\n",
        "\n",
        "%matplotlib inline\n",
        "\n",
        "from torch.distributions.utils import lazy_property\n",
        "import math\n",
        "import h5py\n",
        "from PIL import Image\n",
        "\n",
        "\n",
        "import torch.nn.functional as nnf\n",
        "from torch.utils.data import random_split\n",
        "from torch.optim import SGD\n",
        "from torch.distributions import constraints\n",
        "import torchvision as torchv\n",
        "import torchvision.transforms as torchvt\n",
        "import pickle\n",
        "from sklearn.preprocessing import StandardScaler, MinMaxScaler"
      ],
      "metadata": {
        "id": "q3BHieUUvVtg"
      },
      "execution_count": 56,
      "outputs": []
    },
    {
      "cell_type": "code",
      "execution_count": 57,
      "metadata": {
        "id": "BtvV8mpdgX7r"
      },
      "outputs": [],
      "source": [
        "train_df=pd.read_csv('/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/mitbih_train.csv',header=None)\n",
        "test_df=pd.read_csv('/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/mitbih_test.csv',header=None)"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "train_df.head()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 255
        },
        "id": "y7qIQcfsvl6v",
        "outputId": "075901a9-db03-4f6c-a059-7062818fea50"
      },
      "execution_count": 58,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        0         1         2         3         4         5         6    \\\n",
              "0  0.977941  0.926471  0.681373  0.245098  0.154412  0.191176  0.151961   \n",
              "1  0.960114  0.863248  0.461538  0.196581  0.094017  0.125356  0.099715   \n",
              "2  1.000000  0.659459  0.186486  0.070270  0.070270  0.059459  0.056757   \n",
              "3  0.925414  0.665746  0.541436  0.276243  0.196133  0.077348  0.071823   \n",
              "4  0.967136  1.000000  0.830986  0.586854  0.356808  0.248826  0.145540   \n",
              "\n",
              "        7         8         9    ...  178  179  180  181  182  183  184  185  \\\n",
              "0  0.085784  0.058824  0.049020  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "1  0.088319  0.074074  0.082621  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "2  0.043243  0.054054  0.045946  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "3  0.060773  0.066298  0.058011  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "4  0.089202  0.117371  0.150235  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "\n",
              "   186  187  \n",
              "0  0.0  0.0  \n",
              "1  0.0  0.0  \n",
              "2  0.0  0.0  \n",
              "3  0.0  0.0  \n",
              "4  0.0  0.0  \n",
              "\n",
              "[5 rows x 188 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-2622c982-2250-4959-9c08-efde235b9b65\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "      <th>...</th>\n",
              "      <th>178</th>\n",
              "      <th>179</th>\n",
              "      <th>180</th>\n",
              "      <th>181</th>\n",
              "      <th>182</th>\n",
              "      <th>183</th>\n",
              "      <th>184</th>\n",
              "      <th>185</th>\n",
              "      <th>186</th>\n",
              "      <th>187</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.977941</td>\n",
              "      <td>0.926471</td>\n",
              "      <td>0.681373</td>\n",
              "      <td>0.245098</td>\n",
              "      <td>0.154412</td>\n",
              "      <td>0.191176</td>\n",
              "      <td>0.151961</td>\n",
              "      <td>0.085784</td>\n",
              "      <td>0.058824</td>\n",
              "      <td>0.049020</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.960114</td>\n",
              "      <td>0.863248</td>\n",
              "      <td>0.461538</td>\n",
              "      <td>0.196581</td>\n",
              "      <td>0.094017</td>\n",
              "      <td>0.125356</td>\n",
              "      <td>0.099715</td>\n",
              "      <td>0.088319</td>\n",
              "      <td>0.074074</td>\n",
              "      <td>0.082621</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.659459</td>\n",
              "      <td>0.186486</td>\n",
              "      <td>0.070270</td>\n",
              "      <td>0.070270</td>\n",
              "      <td>0.059459</td>\n",
              "      <td>0.056757</td>\n",
              "      <td>0.043243</td>\n",
              "      <td>0.054054</td>\n",
              "      <td>0.045946</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.925414</td>\n",
              "      <td>0.665746</td>\n",
              "      <td>0.541436</td>\n",
              "      <td>0.276243</td>\n",
              "      <td>0.196133</td>\n",
              "      <td>0.077348</td>\n",
              "      <td>0.071823</td>\n",
              "      <td>0.060773</td>\n",
              "      <td>0.066298</td>\n",
              "      <td>0.058011</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.967136</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.830986</td>\n",
              "      <td>0.586854</td>\n",
              "      <td>0.356808</td>\n",
              "      <td>0.248826</td>\n",
              "      <td>0.145540</td>\n",
              "      <td>0.089202</td>\n",
              "      <td>0.117371</td>\n",
              "      <td>0.150235</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>5 rows × 188 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-2622c982-2250-4959-9c08-efde235b9b65')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-2622c982-2250-4959-9c08-efde235b9b65 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-2622c982-2250-4959-9c08-efde235b9b65');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-9491f1ff-0e16-46b0-87c8-17f0ff08621c\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-9491f1ff-0e16-46b0-87c8-17f0ff08621c')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-9491f1ff-0e16-46b0-87c8-17f0ff08621c button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "train_df"
            }
          },
          "metadata": {},
          "execution_count": 58
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "test_df.shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "dIf_gZb8v4Q5",
        "outputId": "95366043-db03-4d9c-e7e3-d95813fd7055"
      },
      "execution_count": 59,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(21892, 188)"
            ]
          },
          "metadata": {},
          "execution_count": 59
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "train_df[187].value_counts()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 272
        },
        "id": "eeFDll5Ov-F2",
        "outputId": "2d3e017b-4527-45de-fd15-a64f279ae709"
      },
      "execution_count": 60,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "187\n",
              "0.0    72471\n",
              "4.0     6431\n",
              "2.0     5788\n",
              "1.0     2223\n",
              "3.0      641\n",
              "Name: count, dtype: int64"
            ],
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>count</th>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>187</th>\n",
              "      <th></th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0.0</th>\n",
              "      <td>72471</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4.0</th>\n",
              "      <td>6431</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2.0</th>\n",
              "      <td>5788</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1.0</th>\n",
              "      <td>2223</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3.0</th>\n",
              "      <td>641</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div><br><label><b>dtype:</b> int64</label>"
            ]
          },
          "metadata": {},
          "execution_count": 60
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "test_df[187].value_counts()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 272
        },
        "id": "tZPyH_gxwYjC",
        "outputId": "73b59d91-40d3-45ce-c1f5-907e491b46a2"
      },
      "execution_count": 61,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "187\n",
              "0.0    18118\n",
              "4.0     1608\n",
              "2.0     1448\n",
              "1.0      556\n",
              "3.0      162\n",
              "Name: count, dtype: int64"
            ],
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>count</th>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>187</th>\n",
              "      <th></th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0.0</th>\n",
              "      <td>18118</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4.0</th>\n",
              "      <td>1608</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2.0</th>\n",
              "      <td>1448</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1.0</th>\n",
              "      <td>556</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3.0</th>\n",
              "      <td>162</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div><br><label><b>dtype:</b> int64</label>"
            ]
          },
          "metadata": {},
          "execution_count": 61
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 62,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 443
        },
        "id": "36rpCbOmtmuy",
        "outputId": "5fc87344-3a18-435b-d3cc-e08096c6f817"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "            0         1         2         3         4         5         6    \\\n",
              "80482  1.000000  0.899749  0.641604  0.314536  0.101504  0.107769  0.111529   \n",
              "80483  0.732252  1.000000  0.983773  0.484787  0.178499  0.111562  0.081136   \n",
              "80484  0.991984  1.000000  0.601202  0.280561  0.158317  0.146293  0.104208   \n",
              "80485  0.778378  0.528378  0.258108  0.128378  0.000000  0.037838  0.167568   \n",
              "80486  1.000000  0.914931  0.531250  0.303819  0.178819  0.157986  0.128472   \n",
              "...         ...       ...       ...       ...       ...       ...       ...   \n",
              "81118  0.771529  1.000000  0.776801  0.316344  0.165202  0.124780  0.117750   \n",
              "81119  0.590000  0.373333  0.283333  0.303333  0.340000  0.263333  0.136667   \n",
              "81120  1.000000  0.939286  0.553571  0.285714  0.166071  0.141071  0.112500   \n",
              "81121  1.000000  0.964981  0.778210  0.513619  0.214008  0.090791  0.112840   \n",
              "81122  0.724014  1.000000  0.801075  0.252688  0.093190  0.066308  0.043011   \n",
              "\n",
              "            7         8         9    ...  178  179  180  181  182  183  184  \\\n",
              "80482  0.071429  0.063910  0.058897  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "80483  0.050710  0.046653  0.046653  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "80484  0.090180  0.080160  0.070140  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "80485  0.235135  0.227027  0.222973  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "80486  0.126736  0.118056  0.111111  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "...         ...       ...       ...  ...  ...  ...  ...  ...  ...  ...  ...   \n",
              "81118  0.108963  0.084359  0.091388  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "81119  0.120000  0.090000  0.110000  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "81120  0.108929  0.094643  0.096429  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "81121  0.097276  0.075227  0.070039  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "81122  0.030466  0.021505  0.021505  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "\n",
              "       185  186  187  \n",
              "80482  0.0  0.0  3.0  \n",
              "80483  0.0  0.0  3.0  \n",
              "80484  0.0  0.0  3.0  \n",
              "80485  0.0  0.0  3.0  \n",
              "80486  0.0  0.0  3.0  \n",
              "...    ...  ...  ...  \n",
              "81118  0.0  0.0  3.0  \n",
              "81119  0.0  0.0  3.0  \n",
              "81120  0.0  0.0  3.0  \n",
              "81121  0.0  0.0  3.0  \n",
              "81122  0.0  0.0  3.0  \n",
              "\n",
              "[641 rows x 188 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-ffd95c94-b7c2-4d8f-9d7e-088e5fccba45\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "      <th>...</th>\n",
              "      <th>178</th>\n",
              "      <th>179</th>\n",
              "      <th>180</th>\n",
              "      <th>181</th>\n",
              "      <th>182</th>\n",
              "      <th>183</th>\n",
              "      <th>184</th>\n",
              "      <th>185</th>\n",
              "      <th>186</th>\n",
              "      <th>187</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>80482</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.899749</td>\n",
              "      <td>0.641604</td>\n",
              "      <td>0.314536</td>\n",
              "      <td>0.101504</td>\n",
              "      <td>0.107769</td>\n",
              "      <td>0.111529</td>\n",
              "      <td>0.071429</td>\n",
              "      <td>0.063910</td>\n",
              "      <td>0.058897</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>80483</th>\n",
              "      <td>0.732252</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.983773</td>\n",
              "      <td>0.484787</td>\n",
              "      <td>0.178499</td>\n",
              "      <td>0.111562</td>\n",
              "      <td>0.081136</td>\n",
              "      <td>0.050710</td>\n",
              "      <td>0.046653</td>\n",
              "      <td>0.046653</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>80484</th>\n",
              "      <td>0.991984</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.601202</td>\n",
              "      <td>0.280561</td>\n",
              "      <td>0.158317</td>\n",
              "      <td>0.146293</td>\n",
              "      <td>0.104208</td>\n",
              "      <td>0.090180</td>\n",
              "      <td>0.080160</td>\n",
              "      <td>0.070140</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>80485</th>\n",
              "      <td>0.778378</td>\n",
              "      <td>0.528378</td>\n",
              "      <td>0.258108</td>\n",
              "      <td>0.128378</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.037838</td>\n",
              "      <td>0.167568</td>\n",
              "      <td>0.235135</td>\n",
              "      <td>0.227027</td>\n",
              "      <td>0.222973</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>80486</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.914931</td>\n",
              "      <td>0.531250</td>\n",
              "      <td>0.303819</td>\n",
              "      <td>0.178819</td>\n",
              "      <td>0.157986</td>\n",
              "      <td>0.128472</td>\n",
              "      <td>0.126736</td>\n",
              "      <td>0.118056</td>\n",
              "      <td>0.111111</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>81118</th>\n",
              "      <td>0.771529</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.776801</td>\n",
              "      <td>0.316344</td>\n",
              "      <td>0.165202</td>\n",
              "      <td>0.124780</td>\n",
              "      <td>0.117750</td>\n",
              "      <td>0.108963</td>\n",
              "      <td>0.084359</td>\n",
              "      <td>0.091388</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>81119</th>\n",
              "      <td>0.590000</td>\n",
              "      <td>0.373333</td>\n",
              "      <td>0.283333</td>\n",
              "      <td>0.303333</td>\n",
              "      <td>0.340000</td>\n",
              "      <td>0.263333</td>\n",
              "      <td>0.136667</td>\n",
              "      <td>0.120000</td>\n",
              "      <td>0.090000</td>\n",
              "      <td>0.110000</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>81120</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.939286</td>\n",
              "      <td>0.553571</td>\n",
              "      <td>0.285714</td>\n",
              "      <td>0.166071</td>\n",
              "      <td>0.141071</td>\n",
              "      <td>0.112500</td>\n",
              "      <td>0.108929</td>\n",
              "      <td>0.094643</td>\n",
              "      <td>0.096429</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>81121</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.964981</td>\n",
              "      <td>0.778210</td>\n",
              "      <td>0.513619</td>\n",
              "      <td>0.214008</td>\n",
              "      <td>0.090791</td>\n",
              "      <td>0.112840</td>\n",
              "      <td>0.097276</td>\n",
              "      <td>0.075227</td>\n",
              "      <td>0.070039</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>81122</th>\n",
              "      <td>0.724014</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.801075</td>\n",
              "      <td>0.252688</td>\n",
              "      <td>0.093190</td>\n",
              "      <td>0.066308</td>\n",
              "      <td>0.043011</td>\n",
              "      <td>0.030466</td>\n",
              "      <td>0.021505</td>\n",
              "      <td>0.021505</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>641 rows × 188 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-ffd95c94-b7c2-4d8f-9d7e-088e5fccba45')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-ffd95c94-b7c2-4d8f-9d7e-088e5fccba45 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-ffd95c94-b7c2-4d8f-9d7e-088e5fccba45');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-b3fdcce9-a229-4437-a788-ebc3cdc6b5e5\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-b3fdcce9-a229-4437-a788-ebc3cdc6b5e5')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-b3fdcce9-a229-4437-a788-ebc3cdc6b5e5 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe"
            }
          },
          "metadata": {},
          "execution_count": 62
        }
      ],
      "source": [
        "train_df[train_df[187] == 3]"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "train_df[train_df[187] == 3].shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "7yq_v6MkwmaO",
        "outputId": "fe79205c-378b-4869-9bb8-f77049a68475"
      },
      "execution_count": 63,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(641, 188)"
            ]
          },
          "metadata": {},
          "execution_count": 63
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 64,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ak7yuR7Htmuz",
        "outputId": "4a7de7f7-afe4-43a9-fa15-1bc1f0f2c25c"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(87554, 188)"
            ]
          },
          "metadata": {},
          "execution_count": 64
        }
      ],
      "source": [
        "train_df.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 65,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "xMdQZLgDtmuz",
        "outputId": "8ace1cfa-dbdd-400b-af68-33ab3fdcae7c"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(21892, 188)"
            ]
          },
          "metadata": {},
          "execution_count": 65
        }
      ],
      "source": [
        "test_df.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 66,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 255
        },
        "id": "iW4eQ7hptmuz",
        "outputId": "eccee1ad-8def-4496-94c2-1849a09731cf"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        0         1         2         3         4         5         6    \\\n",
              "0  0.977941  0.926471  0.681373  0.245098  0.154412  0.191176  0.151961   \n",
              "1  0.960114  0.863248  0.461538  0.196581  0.094017  0.125356  0.099715   \n",
              "2  1.000000  0.659459  0.186486  0.070270  0.070270  0.059459  0.056757   \n",
              "3  0.925414  0.665746  0.541436  0.276243  0.196133  0.077348  0.071823   \n",
              "4  0.967136  1.000000  0.830986  0.586854  0.356808  0.248826  0.145540   \n",
              "\n",
              "        7         8         9    ...  178  179  180  181  182  183  184  185  \\\n",
              "0  0.085784  0.058824  0.049020  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "1  0.088319  0.074074  0.082621  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "2  0.043243  0.054054  0.045946  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "3  0.060773  0.066298  0.058011  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "4  0.089202  0.117371  0.150235  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "\n",
              "   186  187  \n",
              "0  0.0  0.0  \n",
              "1  0.0  0.0  \n",
              "2  0.0  0.0  \n",
              "3  0.0  0.0  \n",
              "4  0.0  0.0  \n",
              "\n",
              "[5 rows x 188 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-395d8397-24e6-4a39-96e6-dae562952746\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "      <th>...</th>\n",
              "      <th>178</th>\n",
              "      <th>179</th>\n",
              "      <th>180</th>\n",
              "      <th>181</th>\n",
              "      <th>182</th>\n",
              "      <th>183</th>\n",
              "      <th>184</th>\n",
              "      <th>185</th>\n",
              "      <th>186</th>\n",
              "      <th>187</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.977941</td>\n",
              "      <td>0.926471</td>\n",
              "      <td>0.681373</td>\n",
              "      <td>0.245098</td>\n",
              "      <td>0.154412</td>\n",
              "      <td>0.191176</td>\n",
              "      <td>0.151961</td>\n",
              "      <td>0.085784</td>\n",
              "      <td>0.058824</td>\n",
              "      <td>0.049020</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.960114</td>\n",
              "      <td>0.863248</td>\n",
              "      <td>0.461538</td>\n",
              "      <td>0.196581</td>\n",
              "      <td>0.094017</td>\n",
              "      <td>0.125356</td>\n",
              "      <td>0.099715</td>\n",
              "      <td>0.088319</td>\n",
              "      <td>0.074074</td>\n",
              "      <td>0.082621</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.659459</td>\n",
              "      <td>0.186486</td>\n",
              "      <td>0.070270</td>\n",
              "      <td>0.070270</td>\n",
              "      <td>0.059459</td>\n",
              "      <td>0.056757</td>\n",
              "      <td>0.043243</td>\n",
              "      <td>0.054054</td>\n",
              "      <td>0.045946</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.925414</td>\n",
              "      <td>0.665746</td>\n",
              "      <td>0.541436</td>\n",
              "      <td>0.276243</td>\n",
              "      <td>0.196133</td>\n",
              "      <td>0.077348</td>\n",
              "      <td>0.071823</td>\n",
              "      <td>0.060773</td>\n",
              "      <td>0.066298</td>\n",
              "      <td>0.058011</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.967136</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.830986</td>\n",
              "      <td>0.586854</td>\n",
              "      <td>0.356808</td>\n",
              "      <td>0.248826</td>\n",
              "      <td>0.145540</td>\n",
              "      <td>0.089202</td>\n",
              "      <td>0.117371</td>\n",
              "      <td>0.150235</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>5 rows × 188 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-395d8397-24e6-4a39-96e6-dae562952746')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-395d8397-24e6-4a39-96e6-dae562952746 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-395d8397-24e6-4a39-96e6-dae562952746');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-fe37ac20-c51a-4fd4-938c-5103c38f6054\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-fe37ac20-c51a-4fd4-938c-5103c38f6054')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-fe37ac20-c51a-4fd4-938c-5103c38f6054 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "train_df"
            }
          },
          "metadata": {},
          "execution_count": 66
        }
      ],
      "source": [
        "train_df.head(5)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 67,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 255
        },
        "id": "EGqGjnDHtmuz",
        "outputId": "b186d816-9706-499a-8fdf-9793e87079b8"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "            0         1         2         3         4         5         6    \\\n",
              "87549  0.807018  0.494737  0.536842  0.529825  0.491228  0.484211  0.456140   \n",
              "87550  0.718333  0.605000  0.486667  0.361667  0.231667  0.120000  0.051667   \n",
              "87551  0.906122  0.624490  0.595918  0.575510  0.530612  0.481633  0.444898   \n",
              "87552  0.858228  0.645570  0.845570  0.248101  0.167089  0.131646  0.121519   \n",
              "87553  0.901506  0.845886  0.800695  0.748552  0.687138  0.599073  0.512167   \n",
              "\n",
              "            7         8         9    ...  178  179  180  181  182  183  184  \\\n",
              "87549  0.396491  0.284211  0.136842  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "87550  0.001667  0.000000  0.013333  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "87551  0.387755  0.322449  0.191837  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "87552  0.121519  0.118987  0.103797  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "87553  0.427578  0.395133  0.402086  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "\n",
              "       185  186  187  \n",
              "87549  0.0  0.0  4.0  \n",
              "87550  0.0  0.0  4.0  \n",
              "87551  0.0  0.0  4.0  \n",
              "87552  0.0  0.0  4.0  \n",
              "87553  0.0  0.0  4.0  \n",
              "\n",
              "[5 rows x 188 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-36355da6-f4c5-4737-a420-16d73b1dba79\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "      <th>...</th>\n",
              "      <th>178</th>\n",
              "      <th>179</th>\n",
              "      <th>180</th>\n",
              "      <th>181</th>\n",
              "      <th>182</th>\n",
              "      <th>183</th>\n",
              "      <th>184</th>\n",
              "      <th>185</th>\n",
              "      <th>186</th>\n",
              "      <th>187</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>87549</th>\n",
              "      <td>0.807018</td>\n",
              "      <td>0.494737</td>\n",
              "      <td>0.536842</td>\n",
              "      <td>0.529825</td>\n",
              "      <td>0.491228</td>\n",
              "      <td>0.484211</td>\n",
              "      <td>0.456140</td>\n",
              "      <td>0.396491</td>\n",
              "      <td>0.284211</td>\n",
              "      <td>0.136842</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>4.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>87550</th>\n",
              "      <td>0.718333</td>\n",
              "      <td>0.605000</td>\n",
              "      <td>0.486667</td>\n",
              "      <td>0.361667</td>\n",
              "      <td>0.231667</td>\n",
              "      <td>0.120000</td>\n",
              "      <td>0.051667</td>\n",
              "      <td>0.001667</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.013333</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>4.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>87551</th>\n",
              "      <td>0.906122</td>\n",
              "      <td>0.624490</td>\n",
              "      <td>0.595918</td>\n",
              "      <td>0.575510</td>\n",
              "      <td>0.530612</td>\n",
              "      <td>0.481633</td>\n",
              "      <td>0.444898</td>\n",
              "      <td>0.387755</td>\n",
              "      <td>0.322449</td>\n",
              "      <td>0.191837</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>4.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>87552</th>\n",
              "      <td>0.858228</td>\n",
              "      <td>0.645570</td>\n",
              "      <td>0.845570</td>\n",
              "      <td>0.248101</td>\n",
              "      <td>0.167089</td>\n",
              "      <td>0.131646</td>\n",
              "      <td>0.121519</td>\n",
              "      <td>0.121519</td>\n",
              "      <td>0.118987</td>\n",
              "      <td>0.103797</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>4.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>87553</th>\n",
              "      <td>0.901506</td>\n",
              "      <td>0.845886</td>\n",
              "      <td>0.800695</td>\n",
              "      <td>0.748552</td>\n",
              "      <td>0.687138</td>\n",
              "      <td>0.599073</td>\n",
              "      <td>0.512167</td>\n",
              "      <td>0.427578</td>\n",
              "      <td>0.395133</td>\n",
              "      <td>0.402086</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>4.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>5 rows × 188 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-36355da6-f4c5-4737-a420-16d73b1dba79')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-36355da6-f4c5-4737-a420-16d73b1dba79 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-36355da6-f4c5-4737-a420-16d73b1dba79');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-b5229d16-13ac-47b4-a20e-4214ef873b95\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-b5229d16-13ac-47b4-a20e-4214ef873b95')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-b5229d16-13ac-47b4-a20e-4214ef873b95 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe"
            }
          },
          "metadata": {},
          "execution_count": 67
        }
      ],
      "source": [
        "train_df.tail(5)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 68,
      "metadata": {
        "id": "xhJzHyPjtmuz"
      },
      "outputs": [],
      "source": [
        "# omit last column as y\n",
        "x_train = train_df.iloc[:,:187]\n",
        "x_test = test_df.iloc[:,:187]"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from pyts.image import GramianAngularField\n",
        "import seaborn as sns\n",
        "\n",
        "def load_mitbih_csv():\n",
        "    try:\n",
        "        # Path to your dataset\n",
        "        file_path = \"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/mitbih_train.csv\"\n",
        "\n",
        "        # Load the CSV file\n",
        "        df = pd.read_csv(file_path, header=None)  # No header in the MIT-BIH dataset\n",
        "\n",
        "        print(\"Dataset loaded successfully!\")\n",
        "        print(\"Shape of dataset:\", df.shape)\n",
        "\n",
        "        # Extract signals and labels\n",
        "        X = df.iloc[:, :-1].values  # All columns except the last one (ECG signal data)\n",
        "        y = df.iloc[:, -1].values   # The last column (labels)\n",
        "\n",
        "        print(\"Signals shape:\", X.shape)\n",
        "        print(\"Labels shape:\", y.shape)\n",
        "\n",
        "        # Print class distribution\n",
        "        unique_labels, counts = np.unique(y, return_counts=True)\n",
        "        print(\"\\nClass distribution:\")\n",
        "        for label, count in zip(unique_labels, counts):\n",
        "            print(f\"Class {label}: {count} samples\")\n",
        "\n",
        "        return X, y\n",
        "\n",
        "    except Exception as e:\n",
        "        print(f\"Error loading data: {str(e)}\")\n",
        "        raise\n",
        "\n",
        "# Load dataset\n",
        "X, y = load_mitbih_csv()\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "i6JEgJWEFMxe",
        "outputId": "f405fe2a-2578-486d-df71-90a797df8ae5"
      },
      "execution_count": 69,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Dataset loaded successfully!\n",
            "Shape of dataset: (87554, 188)\n",
            "Signals shape: (87554, 187)\n",
            "Labels shape: (87554,)\n",
            "\n",
            "Class distribution:\n",
            "Class 0.0: 72471 samples\n",
            "Class 1.0: 2223 samples\n",
            "Class 2.0: 5788 samples\n",
            "Class 3.0: 641 samples\n",
            "Class 4.0: 6431 samples\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "from pyts.image import GramianAngularField\n",
        "\n",
        "# Load dataset\n",
        "def load_mitbih_csv():\n",
        "    file_path = \"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/mitbih_train.csv\"\n",
        "\n",
        "    df = pd.read_csv(file_path, header=None)\n",
        "    print(\"Dataset loaded successfully! Shape:\", df.shape)\n",
        "\n",
        "    # Extract signals and labels\n",
        "    X = df.iloc[:, :-1].values  # ECG signals\n",
        "    y = df.iloc[:, -1].values   # Labels\n",
        "\n",
        "    return X, y\n",
        "\n",
        "# Load data\n",
        "X, y = load_mitbih_csv()\n",
        "\n",
        "# Select a small subset to speed up GAF generation\n",
        "selected_class = 0  # Normal beats (adjust as needed)\n",
        "num_samples = 3  # Reduce number of samples for fast processing\n",
        "selected_indices = np.where(y == selected_class)[0][:num_samples]\n",
        "X_selected = X[selected_indices]\n",
        "\n",
        "# Convert ECG signals to GAF images\n",
        "gaf = GramianAngularField(method='summation', image_size=64)  # Smaller image size for speed\n",
        "X_gaf = gaf.fit_transform(X_selected)  # Convert selected samples\n",
        "\n",
        "# Plot GAF images\n",
        "fig, axes = plt.subplots(1, num_samples, figsize=(10, 3))\n",
        "for i in range(num_samples):\n",
        "    sns.heatmap(X_gaf[i], cmap='gray', square=True, cbar=False, ax=axes[i])\n",
        "    axes[i].set_title(f\"GAF Image {i+1}\")\n",
        "\n",
        "    axes[i].axis('off')\n",
        "\n",
        "plt.show()\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 248
        },
        "id": "oqR9PhbwD_GB",
        "outputId": "3108aa44-2bd5-40fe-b267-afdc28d05d8c"
      },
      "execution_count": 70,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Dataset loaded successfully! Shape: (87554, 188)\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x300 with 3 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxoAAAEOCAYAAAAOmGH2AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOIBJREFUeJzt3XmsHtV5x/HHW303+3rfN2yMjZ0YKA40TYWBQgngIitiCd2M06ZJW5SUpKFSkwaRVChsKUht0whaUIUdJEKd1KgttYEmUWlJKpICJSimtonBC97uYvvaGHv6R8TkOb973+dd7sF34fuRkGZ8Zs4y953zvod5zpkRRVEUBgAAAAAZjRzoCgAAAAAYfhhoAAAAAMiOgQYAAACA7BhoAAAAAMiOgQYAAACA7BhoAAAAAMiOgQYAAACA7BhoAAAAAMiOgQYAAACA7BhoAAAAAMiOgUaNtm/fbjfffLOdddZZ1tLSYi0tLbZs2TL7oz/6I3vhhRcqnnfrrbfaiBEj7IYbbugzfceOHTZixIg+//ulX/qlsE4PP/ywjRgxwv77v/+7X20b7L72ta/ZddddZ/PmzbMRI0bYTTfdNNBVAupGHzIwdu7cabfffrtdcMEFNnHiRJsyZYpdfPHFtmXLloGuGlA3+pGB0dPTY7/7u79r73vf+6y9vd3a2trsnHPOsfvvv99OnDgx0NUb1EYPdAWGgieeeMJuuOEGGz16tP3mb/6mnXPOOTZy5Eh75ZVX7B//8R/ta1/7mm3fvt3mz5+fnFcUhX3jG9+wBQsW2KZNm6y7u9vGjRvXZxk33nijXXXVVcm/TZ069V1r01By5513Wnd3t11wwQW2e/fuga4OUDf6kIHz7W9/2+68805bs2aNrV271t5++237h3/4B7v88svt7//+723dunUDXUWgJvQjA6enp8f+93//16666ipbsGCBjRw50p599lm75ZZb7LnnnrMNGzYMdBUHrwKhV199tWhtbS3OPvvsYteuXb3ST5w4Udx///3FT3/6015pTz/9dGFmxdNPP12MGTOmePjhh3sds3379sLMirvvvrvuuj300EOFmRU/+MEP6j53KNmxY0dx6tSpoiiKorW1tVi7du3AVgioA33IwHrppZeKffv2Jf927NixYunSpcWcOXMGqFZAfehHBqebb765MLNi9+7dA12VQYvQqSruuusuO3LkiD300EM2c+bMXumjR4+2T33qUzZ37txeaevXr7dly5bZJZdcYpdddpmtX7/+Xa/vTTfdZG1tbfbTn/7UVq9ebW1tbTZ79mz767/+azMze/HFF+3SSy+11tZWmz9/fq9R+MGDB+1P/uRP7P3vf7+1tbXZ+PHj7corr7T/+Z//6VXWa6+9Ztdcc421trbatGnT7JZbbrEnn3zSRowYYf/+7/+eHPvcc8/Zhz/8YWtvb7eWlhZbtWqV/cd//EdNbZo/f76NGDGisQsCDDD6kIHtQ5YvX25TpkxJ/m3s2LF21VVX2euvv27d3d11XiHg9KMfGfjfIn1ZsGCBmZl1dHQ0nMdwx0CjiieeeMLOPPNMu/DCC+s67/jx4/b444/bjTfeaGY/exz59NNP2549e/o8/ujRo7Z///7kv0bj/k6ePGlXXnmlzZ071+666y5bsGCB3Xzzzfbwww/bhz/8YVu5cqXdeeedNm7cOPud3/kd2759e3nutm3b7Fvf+patXr3avvrVr9rnPvc5e/HFF23VqlW2a9eu8rgjR47YpZdealu2bLFPfepT9vnPf96effZZ+9M//dNe9Xn66aftoosusq6uLrvtttvsjjvusI6ODrv00kvt+9//fkNtBIYK+pDB2Yfs2bOnjHEHBjv6kcHRj7z11lu2f/9+27lzp23cuNHuuecemz9/vp155pkNXaP3hIF+pDKYdXZ2FmZWrFmzplfaoUOHin379pX/HT16NEn/5je/WZhZsXXr1qIoiqKrq6toamoq/vIv/zI57p3HlX3998wzz4T16+tx5dq1awszK+64446krs3NzcWIESOKRx99tPz3V155pTCz4rbbbiv/7dixY8XJkyd71XHs2LHFl770pfLf7r333sLMim9961vlv/X09BRLly5N6n7q1Kli8eLFxRVXXFGGPxVFURw9erQ444wzissvvzxsoyJ0CkMJfcjP6zhY+pCiKIqtW7cWTU1NxW//9m/XfS5wutGP/LyOA92PfOMb30iuzcqVK4sXXnihpnPfq3iiEejq6jIzs7a2tl5pF198sU2dOrX8753Hge9Yv369rVy5shzljhs3zq6++uqKjyx///d/3zZv3pz8d8455zRc99/7vd8rtydMmGBLliyx1tZWu/7668t/X7JkiU2YMMG2bdtW/tvYsWNt5MiffSxOnjxpBw4csLa2NluyZIk9//zz5XH/+q//arNnz7Zrrrmm/Lempib7+Mc/ntTjRz/6kW3dutV+4zd+ww4cOFD+H5IjR47Yr/7qr9p3v/tdO3XqVMPtBAYz+pDB14ccPXrUrrvuOmtubravfOUrtV8QYIDQjwyefuSSSy6xzZs322OPPWaf/OQnbcyYMXbkyJH6L8x7CKtOBd5ZleHw4cO90r7+9a9bd3e37d27137rt34rSevo6LB//ud/tptvvtleffXV8t8/9KEP2eOPP24/+clP7KyzzkrOWbx4sV122WVZ6t3U1NRrlYj29nabM2dOr7kO7e3tdujQoXL/1KlTdv/999vf/M3f2Pbt2+3kyZNl2uTJk8vt1157zRYtWtQrP318uHXrVjMzW7t2bcX6dnZ22sSJE2tsHTB00IcMrj7k5MmT9tGPftRefvll+5d/+RebNWtW1XOAgUY/Mnj6kenTp9v06dPNzOzaa6+1O+64wy6//HLbunWrzZgxIzz3vYqBRqC9vd1mzpxpL730Uq+0d+Ikd+zY0Svtscces+PHj9u9995r9957b6/09evX2+233569vu8YNWpUXf9eFEW5fccdd9if//mf28c+9jH78pe/bJMmTbKRI0faH//xHzf05OGdc+6++24799xz+zymr/9LAwwH9CGDqw/5+Mc/bk888YStX7/eLr300rrrAgwE+pHB1Y941157rX3+85+3b3/72/aJT3yi7vPfCxhoVHH11Vfbgw8+aN///vftggsuqOmc9evX2/ve9z677bbbeqV9/etftw0bNryrN3d/fPOb37RLLrnE/u7v/i75946OjmTllvnz59vLL79sRVEk/yfB/18TM7NFixaZmdn48eOz/V8SYCihD/mZge5DPve5z9lDDz1k9913XzkxFhgq6Ed+ZqD7EdXT02NmP3sagr4xR6OKW2+91VpaWuxjH/uY7d27t1e6H4Gb/ewttN/97nft+uuvt2uvvbbXf+vWrbNXX33VnnvuudPVhLqMGjWqV5see+wxe+ONN5J/u+KKK+yNN96wf/qnfyr/7dixY/bAAw8kx51//vm2aNEiu+eee/p87Ltv376MtQcGH/qQge9D7r77brvnnnvsz/7sz+zTn/50Pc0BBgX6kYHtR/bv39+rPmZmDz74oJmZrVy5Mm7QexhPNKpYvHixbdiwwW688UZbsmRJ+TbOoihs+/bttmHDBhs5cqTNmTPHzMw2bNhgRVEkE5O8q666ykaPHm3r16+ve5m602H16tX2pS99ydatW2e//Mu/bC+++KKtX7/eFi5cmBz3iU98wv7qr/7KbrzxRvv0pz9tM2fOtPXr11tTU5OZWfl/FkaOHGkPPvigXXnllbZ8+XJbt26dzZ4929544w175plnbPz48bZp06awTps2bSrXzj5x4oS98MIL9hd/8RdmZnbNNdfYihUrcl8GIBv6kIHtQzZu3Gi33nqrLV682M4++2x75JFHkvTLL7+8jLkGBiv6kYHtRx555BH727/9W1uzZo0tXLjQuru77cknn7TNmzfbr//6rxOKGTnNq1wNWa+++mrxB3/wB8WZZ55ZNDU1Fc3NzcXSpUuLT37yk8WPfvSj8rj3v//9xbx588K8Lr744mLatGnFiRMnsr+Nc+3atUVra2uvY1etWlUsX76817/Pnz+/uPrqq8v9Y8eOFZ/97GeLmTNnFs3NzcWHPvSh4j//8z+LVatWFatWrUrO3bZtW3H11VcXzc3NxdSpU4vPfvazxeOPP16YWfFf//VfybE//OEPi4985CPF5MmTi7Fjxxbz588vrr/++uKpp56q2s53lsnr67+HHnqo6vnAYEAfMjB9yG233Vax/7Aalu4EBhP6kYHpR37wgx8U1113XTFv3rxi7NixRWtra/GLv/iLxVe/+tXixIkTtVym96wRRdHHsyCgQffdd5/dcsst9vrrr9vs2bMHujoAhhj6EAD9RT8yeDDQQMN6enqsubm53D927Jidd955dvLkSfvJT34ygDUDMBTQhwDoL/qRwY05GmjYRz7yEZs3b56de+651tnZaY888oi98sorFV8EBAAefQiA/qIfGdwYaKBhV1xxhT344IO2fv16O3nypC1btsweffRRu+GGGwa6agCGAPoQAP1FPzK4EToFAAAAIDveowEAAAAgOwYaAAAAALJjoAEAAAAgu4Yng69bt67cfvbZZ5O03bt3l9ujRo2qmMc7b2x8xy/8wi+U22PGjKmYpvmOHl25GadOnUr2T548WTHtrbfeqniu1tWXP3bs2CStra2t3G5vb0/Sjhw5Um7v378/rKvf1zZu2bKl3H755ZeTtC984Qvl9ptvvpmkaTv8FJ3Ozs4k7ejRo4bBaThMrbriiiuS/R//+Mfl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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 71,
      "metadata": {
        "id": "qHsPZ_uXtmuz"
      },
      "outputs": [],
      "source": [
        "# For exploratory purpose only\n",
        "gasf = GramianAngularField(image_size=64, method='summation')\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "from pyts.image import GramianAngularField\n",
        "\n",
        "# Sample ECG signal (Replace with actual ECG signal)\n",
        "n_timestamps = 128  # Length of ECG signal\n",
        "ecg_signal = np.sin(np.linspace(0, 4 * np.pi, n_timestamps))  # Example signal\n",
        "\n",
        "# Ensure image_size is <= n_timestamps\n",
        "gaf = GramianAngularField(image_size=n_timestamps, method='summation')\n",
        "\n",
        "# Transform the signal into a GAF image\n",
        "gaf_image = gaf.fit_transform(ecg_signal.reshape(1, -1))\n",
        "\n",
        "# Print the shape of the GAF image\n",
        "print(\"GAF Image Shape:\", gaf_image.shape)\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "rOkIhecTNy5Z",
        "outputId": "55353967-44ed-4ec2-ced3-47574c2ca659"
      },
      "execution_count": 72,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "GAF Image Shape: (1, 128, 128)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "9pUXezhdNiRF"
      },
      "execution_count": 72,
      "outputs": []
    },
    {
      "cell_type": "code",
      "execution_count": 73,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 80
        },
        "id": "l9OMnundtmuz",
        "outputId": "86a2c54a-738e-4527-bc01-c9c1a4820644"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "GramianAngularField(image_size=64)"
            ],
            "text/html": [
              "<style>#sk-container-id-2 {\n",
              "  /* Definition of color scheme common for light and dark mode */\n",
              "  --sklearn-color-text: #000;\n",
              "  --sklearn-color-text-muted: #666;\n",
              "  --sklearn-color-line: gray;\n",
              "  /* Definition of color scheme for unfitted estimators */\n",
              "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
              "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
              "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
              "  --sklearn-color-unfitted-level-3: chocolate;\n",
              "  /* Definition of color scheme for fitted estimators */\n",
              "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
              "  --sklearn-color-fitted-level-1: #d4ebff;\n",
              "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
              "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
              "\n",
              "  /* Specific color for light theme */\n",
              "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
              "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-icon: #696969;\n",
              "\n",
              "  @media (prefers-color-scheme: dark) {\n",
              "    /* Redefinition of color scheme for dark theme */\n",
              "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
              "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-icon: #878787;\n",
              "  }\n",
              "}\n",
              "\n",
              "#sk-container-id-2 {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 pre {\n",
              "  padding: 0;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 input.sk-hidden--visually {\n",
              "  border: 0;\n",
              "  clip: rect(1px 1px 1px 1px);\n",
              "  clip: rect(1px, 1px, 1px, 1px);\n",
              "  height: 1px;\n",
              "  margin: -1px;\n",
              "  overflow: hidden;\n",
              "  padding: 0;\n",
              "  position: absolute;\n",
              "  width: 1px;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-dashed-wrapped {\n",
              "  border: 1px dashed var(--sklearn-color-line);\n",
              "  margin: 0 0.4em 0.5em 0.4em;\n",
              "  box-sizing: border-box;\n",
              "  padding-bottom: 0.4em;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-container {\n",
              "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
              "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
              "     so we also need the `!important` here to be able to override the\n",
              "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
              "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
              "  display: inline-block !important;\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-text-repr-fallback {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              "div.sk-parallel-item,\n",
              "div.sk-serial,\n",
              "div.sk-item {\n",
              "  /* draw centered vertical line to link estimators */\n",
              "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
              "  background-size: 2px 100%;\n",
              "  background-repeat: no-repeat;\n",
              "  background-position: center center;\n",
              "}\n",
              "\n",
              "/* Parallel-specific style estimator block */\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item::after {\n",
              "  content: \"\";\n",
              "  width: 100%;\n",
              "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
              "  flex-grow: 1;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel {\n",
              "  display: flex;\n",
              "  align-items: stretch;\n",
              "  justify-content: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
              "  align-self: flex-end;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
              "  align-self: flex-start;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
              "  width: 0;\n",
              "}\n",
              "\n",
              "/* Serial-specific style estimator block */\n",
              "\n",
              "#sk-container-id-2 div.sk-serial {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "  align-items: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  padding-right: 1em;\n",
              "  padding-left: 1em;\n",
              "}\n",
              "\n",
              "\n",
              "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
              "clickable and can be expanded/collapsed.\n",
              "- Pipeline and ColumnTransformer use this feature and define the default style\n",
              "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
              "*/\n",
              "\n",
              "/* Pipeline and ColumnTransformer style (default) */\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable {\n",
              "  /* Default theme specific background. It is overwritten whether we have a\n",
              "  specific estimator or a Pipeline/ColumnTransformer */\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "/* Toggleable label */\n",
              "#sk-container-id-2 label.sk-toggleable__label {\n",
              "  cursor: pointer;\n",
              "  display: flex;\n",
              "  width: 100%;\n",
              "  margin-bottom: 0;\n",
              "  padding: 0.5em;\n",
              "  box-sizing: border-box;\n",
              "  text-align: center;\n",
              "  align-items: start;\n",
              "  justify-content: space-between;\n",
              "  gap: 0.5em;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 label.sk-toggleable__label .caption {\n",
              "  font-size: 0.6rem;\n",
              "  font-weight: lighter;\n",
              "  color: var(--sklearn-color-text-muted);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
              "  /* Arrow on the left of the label */\n",
              "  content: \"▸\";\n",
              "  float: left;\n",
              "  margin-right: 0.25em;\n",
              "  color: var(--sklearn-color-icon);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "/* Toggleable content - dropdown */\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content {\n",
              "  max-height: 0;\n",
              "  max-width: 0;\n",
              "  overflow: hidden;\n",
              "  text-align: left;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content pre {\n",
              "  margin: 0.2em;\n",
              "  border-radius: 0.25em;\n",
              "  color: var(--sklearn-color-text);\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
              "  /* Expand drop-down */\n",
              "  max-height: 200px;\n",
              "  max-width: 100%;\n",
              "  overflow: auto;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
              "  content: \"▾\";\n",
              "}\n",
              "\n",
              "/* Pipeline/ColumnTransformer-specific style */\n",
              "\n",
              "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator-specific style */\n",
              "\n",
              "/* Colorize estimator box */\n",
              "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
              "#sk-container-id-2 div.sk-label label {\n",
              "  /* The background is the default theme color */\n",
              "  color: var(--sklearn-color-text-on-default-background);\n",
              "}\n",
              "\n",
              "/* On hover, darken the color of the background */\n",
              "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "/* Label box, darken color on hover, fitted */\n",
              "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator label */\n",
              "\n",
              "#sk-container-id-2 div.sk-label label {\n",
              "  font-family: monospace;\n",
              "  font-weight: bold;\n",
              "  display: inline-block;\n",
              "  line-height: 1.2em;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-label-container {\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              "/* Estimator-specific */\n",
              "#sk-container-id-2 div.sk-estimator {\n",
              "  font-family: monospace;\n",
              "  border: 1px dotted var(--sklearn-color-border-box);\n",
              "  border-radius: 0.25em;\n",
              "  box-sizing: border-box;\n",
              "  margin-bottom: 0.5em;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-estimator.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "/* on hover */\n",
              "#sk-container-id-2 div.sk-estimator:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
              "\n",
              "/* Common style for \"i\" and \"?\" */\n",
              "\n",
              ".sk-estimator-doc-link,\n",
              "a:link.sk-estimator-doc-link,\n",
              "a:visited.sk-estimator-doc-link {\n",
              "  float: right;\n",
              "  font-size: smaller;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1em;\n",
              "  height: 1em;\n",
              "  width: 1em;\n",
              "  text-decoration: none !important;\n",
              "  margin-left: 0.5em;\n",
              "  text-align: center;\n",
              "  /* unfitted */\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted,\n",
              "a:link.sk-estimator-doc-link.fitted,\n",
              "a:visited.sk-estimator-doc-link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "/* Span, style for the box shown on hovering the info icon */\n",
              ".sk-estimator-doc-link span {\n",
              "  display: none;\n",
              "  z-index: 9999;\n",
              "  position: relative;\n",
              "  font-weight: normal;\n",
              "  right: .2ex;\n",
              "  padding: .5ex;\n",
              "  margin: .5ex;\n",
              "  width: min-content;\n",
              "  min-width: 20ex;\n",
              "  max-width: 50ex;\n",
              "  color: var(--sklearn-color-text);\n",
              "  box-shadow: 2pt 2pt 4pt #999;\n",
              "  /* unfitted */\n",
              "  background: var(--sklearn-color-unfitted-level-0);\n",
              "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted span {\n",
              "  /* fitted */\n",
              "  background: var(--sklearn-color-fitted-level-0);\n",
              "  border: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link:hover span {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
              "\n",
              "#sk-container-id-2 a.estimator_doc_link {\n",
              "  float: right;\n",
              "  font-size: 1rem;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1rem;\n",
              "  height: 1rem;\n",
              "  width: 1rem;\n",
              "  text-decoration: none;\n",
              "  /* unfitted */\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "#sk-container-id-2 a.estimator_doc_link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GramianAngularField(image_size=64)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator  sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label  sk-toggleable__label-arrow\"><div><div>GramianAngularField</div></div><div><span class=\"sk-estimator-doc-link \">i<span>Not fitted</span></span></div></label><div class=\"sk-toggleable__content \"><pre>GramianAngularField(image_size=64)</pre></div> </div></div></div></div>"
            ]
          },
          "metadata": {},
          "execution_count": 73
        }
      ],
      "source": [
        "gasf"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 74,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        },
        "id": "xdjE_aaztmu0",
        "outputId": "422e5c7d-0fe6-49da-b37d-3bcdd1e1429a"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "pyts.image.gaf.GramianAngularField"
            ],
            "text/html": [
              "<div style=\"max-width:800px; border: 1px solid var(--colab-border-color);\"><style>\n",
              "      pre.function-repr-contents {\n",
              "        overflow-x: auto;\n",
              "        padding: 8px 12px;\n",
              "        max-height: 500px;\n",
              "      }\n",
              "\n",
              "      pre.function-repr-contents.function-repr-contents-collapsed {\n",
              "        cursor: pointer;\n",
              "        max-height: 100px;\n",
              "      }\n",
              "    </style>\n",
              "    <pre style=\"white-space: initial; background:\n",
              "         var(--colab-secondary-surface-color); padding: 8px 12px;\n",
              "         border-bottom: 1px solid var(--colab-border-color);\"><b>pyts.image.gaf.GramianAngularField</b><br/>def __init__(image_size=1.0, sample_range=(-1, 1), method=&#x27;summation&#x27;, overlapping=False, flatten=False)</pre><pre class=\"function-repr-contents function-repr-contents-collapsed\" style=\"\"><a class=\"filepath\" style=\"display:none\" href=\"#\">/usr/local/lib/python3.11/dist-packages/pyts/image/gaf.py</a>Gramian Angular Field.\n",
              "\n",
              "Parameters\n",
              "----------\n",
              "image_size : int or float (default = 1.)\n",
              "    Shape of the output images. If float, it represents a percentage\n",
              "    of the size of each time series and must be between 0 and 1. Output\n",
              "    images are square, thus providing the size of one dimension is enough.\n",
              "\n",
              "sample_range : None or tuple (min, max) (default = (-1, 1))\n",
              "    Desired range of transformed data. If None, no scaling is performed\n",
              "    and all the values of the input data must be between -1 and 1.\n",
              "    If tuple, each sample is scaled between min and max; min must be\n",
              "    greater than or equal to -1 and max must be lower than or equal to 1.\n",
              "\n",
              "method : &#x27;summation&#x27; or &#x27;difference&#x27; (default = &#x27;summation&#x27;)\n",
              "    Type of Gramian Angular Field. &#x27;s&#x27; can be used for &#x27;summation&#x27;\n",
              "    and &#x27;d&#x27; for &#x27;difference&#x27;.\n",
              "\n",
              "overlapping : bool (default = False)\n",
              "    If True, reduce the size of each time series using PAA with possible\n",
              "    overlapping windows.\n",
              "\n",
              "flatten : bool (default = False)\n",
              "    If True, images are flattened to be one-dimensional.\n",
              "\n",
              "References\n",
              "----------\n",
              ".. [1] Z. Wang and T. Oates, &quot;Encoding Time Series as Images for Visual\n",
              "       Inspection and Classification Using Tiled Convolutional Neural\n",
              "       Networks.&quot; AAAI Workshop (2015).\n",
              "\n",
              "Examples\n",
              "--------\n",
              "&gt;&gt;&gt; from pyts.datasets import load_gunpoint\n",
              "&gt;&gt;&gt; from pyts.image import GramianAngularField\n",
              "&gt;&gt;&gt; X, _, _, _ = load_gunpoint(return_X_y=True)\n",
              "&gt;&gt;&gt; transformer = GramianAngularField()\n",
              "&gt;&gt;&gt; X_new = transformer.transform(X)\n",
              "&gt;&gt;&gt; X_new.shape\n",
              "(50, 150, 150)</pre>\n",
              "      <script>\n",
              "      if (google.colab.kernel.accessAllowed && google.colab.files && google.colab.files.view) {\n",
              "        for (const element of document.querySelectorAll('.filepath')) {\n",
              "          element.style.display = 'block'\n",
              "          element.onclick = (event) => {\n",
              "            event.preventDefault();\n",
              "            event.stopPropagation();\n",
              "            google.colab.files.view(element.textContent, 32);\n",
              "          };\n",
              "        }\n",
              "      }\n",
              "      for (const element of document.querySelectorAll('.function-repr-contents')) {\n",
              "        element.onclick = (event) => {\n",
              "          event.preventDefault();\n",
              "          event.stopPropagation();\n",
              "          element.classList.toggle('function-repr-contents-collapsed');\n",
              "        };\n",
              "      }\n",
              "      </script>\n",
              "      </div>"
            ]
          },
          "metadata": {},
          "execution_count": 74
        }
      ],
      "source": [
        "type(gasf)"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def convert_to_gaf_batch(x_train, batch_size=100):\n",
        "    gasf = GramianAngularField(image_size=64)  # Smaller image size\n",
        "    gaf_images = []\n",
        "\n",
        "    for i in range(0, len(x_train), batch_size):\n",
        "        batch = x_train[i:i+batch_size]\n",
        "        gaf_images.append(gasf.fit_transform(batch))\n",
        "\n",
        "    return np.vstack(gaf_images)\n",
        "\n",
        "x_gasf_train = convert_to_gaf_batch(x_train, batch_size=100)\n",
        "print(\"Optimized GAF shape:\", x_gasf_train.shape)  # (num_samples, 64, 64)\n"
      ],
      "metadata": {
        "id": "aSWVsecIAMSX"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "import matplotlib.pyplot as plt\n",
        "\n",
        "# Select some random GAF images for visualization\n",
        "num_samples_to_plot = 5\n",
        "fig, axes = plt.subplots(1, num_samples_to_plot, figsize=(15, 5))\n",
        "\n",
        "for i in range(num_samples_to_plot):\n",
        "    axes[i].imshow(x_gasf_train[i], cmap='rainbow')  # Use 'rainbow' for better visualization\n",
        "    axes[i].axis('off')\n",
        "    axes[i].set_title(f\"GAF Image {i+1}\")\n",
        "\n",
        "plt.show()\n"
      ],
      "metadata": {
        "id": "_WyhdNWvAxNe"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "\n",
        "# Convert Pandas Series to a NumPy array\n",
        "x_train_array = np.array(x_train)\n",
        "\n",
        "# Select a single ECG signal for testing and reshape it\n",
        "ecg_signal_test = x_train_array[0].reshape(1, -1)\n",
        "\n",
        "# Convert it to GAF\n",
        "gaf_test_image = gasf.fit_transform(ecg_signal_test)\n",
        "\n",
        "# Display the GAF image\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "plt.imshow(gaf_test_image[0], cmap='rainbow')\n",
        "plt.axis('off')\n",
        "plt.title(\"Test GAF Image\")\n",
        "plt.show()\n"
      ],
      "metadata": {
        "id": "RczVWT8IBuL3"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Use a trained PyTorch model to test the GAF images and predict the class."
      ],
      "metadata": {
        "id": "OGob5tHOCC78"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "'''import torch\n",
        "import torch.nn as nn\n",
        "import torch.optim as optim\n",
        "import torch.nn.functional as F\n",
        "\n",
        "# Example CNN model for ECG classification\n",
        "class ECG_CNN(nn.Module):\n",
        "    def __init__(self):\n",
        "        super(ECG_CNN, self).__init__()\n",
        "        self.conv1 = nn.Conv1d(in_channels=1, out_channels=16, kernel_size=3,stride=1, padding=1)\n",
        "        self.conv2 = nn.Conv1d(16, 32, kernel_size=3,stride=1, padding=1)\n",
        "        self.fc1 = nn.Linear(32 * 164*164, 128)  # Adjust based on input size\n",
        "        self.fc2 = nn.Linear(128, 5)  # 5 classes\n",
        "\n",
        "    def forward(self, x):\n",
        "        x = F.relu(self.conv1(x))\n",
        "        x = F.relu(self.conv2(x))\n",
        "        x = torch.flatten(x, start_dim=1)\n",
        "        x = F.relu(self.fc1(x))\n",
        "        x = self.fc2(x)\n",
        "        return x\n",
        "\n",
        "# Initialize the model\n",
        "model = ECG_CNN()\n",
        "print(\"Model initialized successfully!\")'''\n",
        "\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "945U6uHuC86Z",
        "outputId": "92ef35fb-c5c4-4dfb-b0dd-5b76dc592ca9"
      },
      "execution_count": 32,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Model initialized successfully!\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "torch.save(model.state_dict(), \"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/model.pth\")\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 159
        },
        "id": "pvPmNTHbCrDd",
        "outputId": "3e2de5d6-32a6-415e-bc97-efda3b7362ee"
      },
      "execution_count": 30,
      "outputs": [
        {
          "output_type": "error",
          "ename": "NameError",
          "evalue": "name 'model' is not defined",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-30-e5306979f2d8>\u001b[0m in \u001b[0;36m<cell line: 0>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate_dict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/model.pth\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
            "\u001b[0;31mNameError\u001b[0m: name 'model' is not defined"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Initialize the model\n",
        "model = ECG_CNN()\n",
        "\n",
        "# Load the saved model weights\n",
        "model.load_state_dict(torch.load(\"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/model.pth\",weights_only=True))\n",
        "\n",
        "# Move model to device (CPU or GPU)\n",
        "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
        "model.to(device)\n",
        "\n",
        "# Set model to evaluation mode\n",
        "model.eval()\n",
        "\n",
        "print(\"Model loaded successfully!\")\n",
        "\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 228
        },
        "id": "vTw57mUHE-sa",
        "outputId": "7cc9a4aa-aa0e-483b-95b0-12de0b4fb1cb"
      },
      "execution_count": 31,
      "outputs": [
        {
          "output_type": "error",
          "ename": "NameError",
          "evalue": "name 'ECG_CNN' is not defined",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-31-a41461246c09>\u001b[0m in \u001b[0;36m<cell line: 0>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;31m# Initialize the model\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mECG_CNN\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;31m# Load the saved model weights\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload_state_dict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/model.pth\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mweights_only\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;31mNameError\u001b[0m: name 'ECG_CNN' is not defined"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "✔ Step 1: Visualize GAF images to check the transformation.\n",
        "✔ Step 2: Convert a single test ECG signal to a GAF image and display it.\n",
        "✔ Step 3: Use a trained PyTorch model to test the GAF images and predict the class."
      ],
      "metadata": {
        "id": "lLkBaQhjENJc"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Step 3: Use a trained PyTorch model to test the GAF images and predict the class."
      ],
      "metadata": {
        "id": "0fYxaxyKEVVF"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "'''import torch\n",
        "\n",
        "# Convert GAF image to tensor if using PyTorch\n",
        "gaf_test_tensor = torch.tensor(gaf_test_image, dtype=torch.float32).unsqueeze(1)  # Add channel dimension\n",
        "\n",
        "# Move to GPU if available\n",
        "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
        "gaf_test_tensor = gaf_test_tensor.to(device)\n",
        "\n",
        "# Load trained model and move it to device\n",
        "torch.save(model.state_dict(), \"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/model.pth\")\n",
        "\n",
        "model.to(device)\n",
        "model.eval()  # Set to evaluation mode\n",
        "\n",
        "# Predict\n",
        "with torch.no_grad():\n",
        "    output = model(gaf_test_tensor)\n",
        "    predicted_class = torch.argmax(output, dim=1).cpu().numpy()\n",
        "\n",
        "print(f\"Predicted Class: {predicted_class[0]}\")'''\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 174
        },
        "id": "DKu3eYayCDyJ",
        "outputId": "12d5ca37-7722-4937-911a-4ce369b24998"
      },
      "execution_count": 57,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "'import torch\\n\\n# Convert GAF image to tensor if using PyTorch\\ngaf_test_tensor = torch.tensor(gaf_test_image, dtype=torch.float32).unsqueeze(1)  # Add channel dimension\\n\\n# Move to GPU if available\\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\\ngaf_test_tensor = gaf_test_tensor.to(device)\\n\\n# Load trained model and move it to device\\ntorch.save(model.state_dict(), \"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/model.pth\")\\n\\nmodel.to(device)\\nmodel.eval()  # Set to evaluation mode\\n\\n# Predict\\nwith torch.no_grad():\\n    output = model(gaf_test_tensor)\\n    predicted_class = torch.argmax(output, dim=1).cpu().numpy()\\n\\nprint(f\"Predicted Class: {predicted_class[0]}\")'"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            }
          },
          "metadata": {},
          "execution_count": 57
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 30,
      "metadata": {
        "id": "Hvublfywtmu0"
      },
      "outputs": [],
      "source": [
        "x_gasf_train = gasf.fit_transform(x_train)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 31,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "r8x4uLl9tmu0",
        "outputId": "5540c237-8f7f-48fe-fd72-53e8f728780c"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(87554, 64, 64)"
            ]
          },
          "execution_count": 31,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_gasf_train.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 32,
      "metadata": {
        "id": "gfZvJWk4tmu0"
      },
      "outputs": [],
      "source": [
        "x_gasf_test = gasf.transform(x_test)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 33,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "fLwyrxsxtmu0",
        "outputId": "b361cb7a-a5b6-4eab-bbb8-9e6aae07970c"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "array([[ 1.        ,  0.70645442,  0.1741821 , ..., -1.        ,\n",
              "        -1.        , -1.        ],\n",
              "       [ 0.70645442, -0.00184426, -0.57388761, ..., -0.70645444,\n",
              "        -0.70645444, -0.70645444],\n",
              "       [ 0.1741821 , -0.57388761, -0.93932118, ..., -0.17418212,\n",
              "        -0.17418212, -0.17418212],\n",
              "       ...,\n",
              "       [-1.        , -0.70645444, -0.17418212, ...,  1.        ,\n",
              "         1.        ,  1.        ],\n",
              "       [-1.        , -0.70645444, -0.17418212, ...,  1.        ,\n",
              "         1.        ,  1.        ],\n",
              "       [-1.        , -0.70645444, -0.17418212, ...,  1.        ,\n",
              "         1.        ,  1.        ]])"
            ]
          },
          "execution_count": 33,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_gasf_train[87553]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 34,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "CQELF7L5tmu0",
        "outputId": "db597c00-a886-4484-9092-aafb4189399f"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(187,)"
            ]
          },
          "execution_count": 34,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_train.values[87553, :].shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 35,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 447
        },
        "id": "KJwtgOsftmu0",
        "outputId": "d8bfdb91-63ed-43fa-e6a4-55f74e014c03"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7b7696869f50>]"
            ]
          },
          "execution_count": 35,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# Plot 1 heartbeat\n",
        "x_train.values[87553, :]\n",
        "plt.plot(np.arange(187), x_train.values[87553, :])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 36,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 447
        },
        "id": "BxO5Ro_Ptmu0",
        "outputId": "486de2b6-a77f-4e79-dff5-cfd82ba65156"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<matplotlib.image.AxesImage at 0x7b7695e2a010>"
            ]
          },
          "execution_count": 36,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# GAF for 1 heartbeat\n",
        "plt.imshow(x_gasf_train[87553], cmap='gray', origin='lower')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 37,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "VWGFeOTztmu0",
        "outputId": "60ce4de8-a5fb-4e13-f14b-b23ba3559ac0"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(64, 64)"
            ]
          },
          "execution_count": 37,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_gasf_train[87553].shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 38,
      "metadata": {
        "id": "reuqyYlgtmu0"
      },
      "outputs": [],
      "source": [
        "#plt.imshow(x_gasf_test[21891], cmap='gray', origin='lower')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 39,
      "metadata": {
        "id": "uQe_fnBotmu0"
      },
      "outputs": [],
      "source": [
        "def recurrence_plot(s, eps=None, steps=None):\n",
        "    result = []\n",
        "    if eps==None: eps=0.1\n",
        "    if steps==None: steps=10\n",
        "    d = pairwise_distances(s[:, None])\n",
        "    d = d / eps\n",
        "    d[d > steps] = steps\n",
        "    return d/5. - 1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 40,
      "metadata": {
        "id": "DcO3r7nktmu0"
      },
      "outputs": [],
      "source": [
        "result = recurrence_plot(x_train.values[87553], steps=10)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 41,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "kE41p2hwtmu0",
        "outputId": "23fa6aad-f0c3-4871-fa1e-ae7369a74944"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(187, 187)"
            ]
          },
          "execution_count": 41,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "result.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 42,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 424
        },
        "id": "2QWQ8JB_tmu0",
        "outputId": "7c80bc97-139e-4886-caca-6945ea3815bd"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<matplotlib.image.AxesImage at 0x7b7695d14210>"
            ]
          },
          "execution_count": 42,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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6By61uIwGAwGQ2dgxGEwGAyGRDDiMBgMBkMiGHEYDAaDIRG6ljhuu+02HHfccSgWi9iwYQN+8YtfdLpKIbZt24b3vOc9GBgYwMqVK/HRj34UO3fubIpz1llntexf9dnPfrZDNT6Em266qaVOJ510Uhg+PT2Nq6++GitWrMCyZctw0UUXYf/+/R2s8SEcd9xx6n5gV199NYDF0dZPPPEELrjgAqxZswapVAr33XdfU3gQBPjyl7+M1atXo1QqYePGjXjppZea4rzxxhu49NJLMTg4iOHhYVxxxRWYmJjoWL1rtRquv/56nHzyyejv78eaNWvwyU9+Eq+++mpTHlr/3HLLLR2rNwBcfvnlLXU677zzmuIsdHtH1Vkb46lUCrfeemsYZ6HauiuJ4wc/+AE2b96MG2+8Ec899xzWr1+Pc889F6+99lqnqwYAePzxx3H11VfjySefxIMPPoharYYPfehDmJycbIp35ZVXYu/eveHxla98pUM1Pow//MM/bKrTz372szDsuuuuwz/90z/hhz/8IR5//HG8+uqruPDCCztY20N4+umnm+r84IMPAgD+7M/+LIzT6baenJzE+vXrcdttt6nhX/nKV/CNb3wD3/rWt/DUU0+hv78f5557Lqanp8M4l156Kf71X/8VDz74IO6//3488cQTuOqqqzpW73K5jOeeew433HADnnvuOdx7773YuXMnPvzhD7fEvfnmm5va/9prr+1YvQnnnXdeU52+//3vN4UvdHtH1ZnXde/evfjOd76DVCqFiy66qCnegrR10IV473vfG1x99dXh+czMTLBmzZpg27ZtHayVG6+99loAIHj88cfDa3/0R38U/OVf/mXnKqXgxhtvDNavX6+GjY6OBrlcLvjhD38YXvv1r38dAAi2b9++QDWMh7/8y78MTjjhhKDRaARBsPjaGkDwox/9KDxvNBrByMhIcOutt4bXRkdHg0KhEHz/+98PgiAIfvWrXwUAgqeffjqM8//+3/8LUqlU8Pvf/74j9dbwi1/8IgAQvPzyy+G1Y489Nvja177W3sp5oNX7sssuCz7ykY8403S6veO09Uc+8pHgj//4j5uuLVRbd53FUa1W8eyzz2Ljxo3htXQ6jY0bN2L79u0drJkbY2NjAIDly5c3Xb/rrrtw5JFH4p3vfCe2bNmCcrncieo14aWXXsKaNWtw/PHH49JLL8Urr7wCAHj22WdRq9Wa2v2kk07CMcccs6javVqt4nvf+x4+/elPN22BvhjbmrBnzx7s27evqW2HhoawYcOGsG23b9+O4eFhvPvd7w7jbNy4Eel0Gk899dSC19mFsbExpFIpDA8PN12/5ZZbsGLFCpx66qm49dZbF8WW7Y899hhWrlyJE088EZ/73Odw4MCBMGyxt/f+/fvxk5/8BFdccUVL2EK0dddtcvj6669jZmYGq1atarq+atUqvPjiix2qlRuNRgNf+MIX8P73vx/vfOc7w+uf+MQncOyxx2LNmjV4/vnncf3112Pnzp249957O1bXDRs24M4778SJJ56IvXv3YuvWrfjgBz+IF154Afv27UM+n28RCKtWrcK+ffs6U2EF9913H0ZHR3H55ZeH1xZjW3NQ+2ljmsL27duHlStXNoVns1ksX7580bT/9PQ0rr/+elxyySVNG+99/vOfx2mnnYbly5fj5z//ObZs2YK9e/fiq1/9asfqet555+HCCy/EunXrsHv3bnzxi1/Epk2bsH37dmQymUXf3t/97ncxMDDQ4ipeqLbuOuLoNlx99dV44YUXmuYKADT5Sk8++WSsXr0a55xzDnbv3o0TTjhhoasJANi0aVP4/5RTTsGGDRtw7LHH4h//8R9RKpU6Uqek+Pa3v41NmzZhzZo14bXF2NZLDbVaDX/+53+OIAhw++23N4Vt3rw5/H/KKacgn8/jM5/5DLZt29axLTMuvvji8P/JJ5+MU045BSeccAIee+wxnHPOOR2pUxJ85zvfwaWXXopisdh0faHauutcVUceeSQymUzLap79+/djZGSkQ7XScc011+D+++/Ho48+GvlhlA0bNgAAdu3atRBVi4Xh4WG8/e1vx65duzAyMoJqtYrR0dGmOIup3V9++WU89NBD+I//8T964y22tqb2843pkZGRlsUf9Xodb7zxRsfbn0jj5ZdfxoMPPhi5zfeGDRtQr9fxm9/8ZmEqGAPHH388jjzyyHBMLOb2/ulPf4qdO3dGjnOgfW3ddcSRz+dx+umn4+GHHw6vNRoNPPzwwzjjjDM6WLPDCIIA11xzDX70ox/hkUcewbp16yLT7NixAwCwevXqNtcuPiYmJrB7926sXr0ap59+OnK5XFO779y5E6+88sqiafc77rgDK1euxJ/+6Z964y22tl63bh1GRkaa2nZ8fBxPPfVU2LZnnHEGRkdH8eyzz4ZxHnnkETQajZAIOwEijZdeegkPPfQQVqxYEZlmx44dSKfTLa6gTuJ3v/sdDhw4EI6JxdrewCGr+vTTT8f69esj47atrds+/d4G3HPPPUGhUAjuvPPO4Fe/+lVw1VVXBcPDw8G+ffs6XbUgCILgc5/7XDA0NBQ89thjwd69e8OjXC4HQRAEu3btCm6++ebgmWeeCfbs2RP8+Mc/Do4//vjgzDPP7Gi9/+qv/ip47LHHgj179gT/8i//EmzcuDE48sgjg9deey0IgiD47Gc/GxxzzDHBI488EjzzzDPBGWecEZxxxhkdrTNhZmYmOOaYY4Lrr7++6fpiaeuDBw8Gv/zlL4Nf/vKXAYDgq1/9avDLX/4yXH10yy23BMPDw8GPf/zj4Pnnnw8+8pGPBOvWrQumpqbCPM4777zg1FNPDZ566qngZz/7WfC2t70tuOSSSzpW72q1Gnz4wx8Ojj766GDHjh1NY71SqQRBEAQ///nPg6997WvBjh07gt27dwff+973gqOOOir45Cc/2bF6Hzx4MPjrv/7rYPv27cGePXuChx56KDjttNOCt73tbcH09HSYx0K3d9QYCYIgGBsbC/r6+oLbb7+9Jf1CtnVXEkcQBME3v/nN4Jhjjgny+Xzw3ve+N3jyySc7XaUQANTjjjvuCIIgCF555ZXgzDPPDJYvXx4UCoXgrW99a/Cf//N/DsbGxjpa749//OPB6tWrg3w+H7zlLW8JPv7xjwe7du0Kw6empoL/9J/+U3DEEUcEfX19wcc+9rFg7969HazxYfzzP/9zACDYuXNn0/XF0taPPvqoOiYuu+yyIAgOLcm94YYbglWrVgWFQiE455xzWu7lwIEDwSWXXBIsW7YsGBwcDD71qU8FBw8e7Fi99+zZ4xzrjz76aBAEQfDss88GGzZsCIaGhoJisRi84x3vCP7bf/tvTQJ6oetdLpeDD33oQ8FRRx0V5HK54Nhjjw2uvPLKFsVzods7aowEQRD8/d//fVAqlYLR0dGW9AvZ1ratusFgMBgSoevmOAwGg8HQWRhxGAwGgyERjDgMBoPBkAhGHAaDwWBIBCMOg8FgMCSCEYfBYDAYEsGIw2AwGAyJYMRhMBgMhkQw4jAYDAZDIhhxGAwGgyERjDgMBoPBkAhGHAaDwWBIhP8PD44L4lpgqgQAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 1500x1400 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# Recurrence plot for 1 heartbeat\n",
        "fig = plt.figure(figsize=(15,14))\n",
        "ax = fig.add_subplot(2, 3, 1)\n",
        "ax.imshow(result, cmap='gray')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 43,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 529
        },
        "id": "xqazlALqtmu1",
        "outputId": "5dd20dbb-56c5-4006-8d69-8d9621d24ea0"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "array([[-1.        ],\n",
              "       [-0.66442955],\n",
              "       [ 0.14093959],\n",
              "       ...,\n",
              "       [-1.        ],\n",
              "       [-1.        ],\n",
              "       [-1.        ]])"
            ]
          },
          "execution_count": 43,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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d73rXUtGt8MVV1zRQ9Nf/uVf9tw/2fzO0Yy0Pv300/bxj3/cWq2WXX311T3lTgqvqz6E17zmNdUNN9zQPZ+Zmam2bNlS7dq1awmpiuGZZ56pzKz62te+1r320z/909Vv//ZvLx1RAt7znvdUF154obx34MCBanh4uPrc5z7Xvfa9732vMrNq9+7dJ4nCMvjt3/7t6oUvfGHV6XSqqlp+vDaz6m/+5m+6551Op9q0aVP1gQ98oHvtwIED1ejoaPWXf/mXVVVV1Xe/+93KzKpvfvOb3TL/9//+36rValX/9m//tiR0K/inf/qnysyqxx9/vHvt3HPPrf70T/90cYlLgKL72muvrd70pjeFdZaa3yW8ftOb3lT9zM/8TM+1k8Xrvss4pqam7P7777fLL7+8e21gYMAuv/xy27179xJSFsPBgwfNzGzDhg091z/96U/bGWecYS972cvs1ltvtWPHji0FeT3w/e9/37Zs2WLnnXeeXXPNNfbEE0+Ymdn9999v7Xa7h+8veclL7JxzzllWfJ+amrJPfepT9va3v73n1dfLkdcOjz76qO3du7eHt+vWrbMdO3Z0ebt7925bv369vepVr+qWufzyy21gYMDuu+++k05zBAcPHrRWq2Xr16/vuX777bfb6aefbq94xSvsAx/4gE1PTy8NgQD33HOPbdy40c4//3z7jd/4DXv22We795Y7v/ft22d/+7d/a+94xztm3TsZvO67lxz++7//u83MzNhZZ53Vc/2ss86yhx56aImoiqHT6djv/M7v2E/+5E/ay172su71X/7lX7Zzzz3XtmzZYt/5znfslltusYcfftg+//nPLxmtO3bssE9+8pN2/vnn29NPP2233Xabvfa1r7UHH3zQ9u7dayMjI7MMwllnnWV79+5dGoIF3HnnnXbgwAF729ve1r22HHmN4PxTMu339u7daxs3buy5PzQ0ZBs2bFg2/J+YmLBbbrnF3vrWt/a8eO+3fuu37JWvfKVt2LDBvv71r9utt95qTz/9tH3wgx9cMlqvuOIKu+qqq2z79u32yCOP2B/8wR/Yzp07bffu3TY4OLjs+f0Xf/EXtnbt2llTxSeL133nOPoNbrjhBnvwwQd71grMrGeu9OUvf7lt3rzZLrvsMnvkkUfshS984ckm08zMdu7c2f1/wQUX2I4dO+zcc8+1v/7rv7bx8fEloakufOxjH7OdO3fali1buteWI69XGrTbbfvFX/xFq6rKPvKRj/Tcu/nmm7v/L7jgAhsZGbF3vvOdtmvXriV7ZcZb3vKW7v+Xv/zldsEFF9gLX/hCu+eee+yyyy5bEprqwMc//nG75pprbGxsrOf6yeJ1301VnXHGGTY4ODhrN8++ffts06ZNS0SVhhtvvNG++MUv2le/+tXsh1F27NhhZmZ79uw5GaQVwfr16+1Hf/RHbc+ePbZp0yabmpqyAwcO9JRZTnx//PHH7e6777b//J//c7LccuO18y8l05s2bZq1+WN6etr279+/5Px3p/H444/bXXfdlX3N944dO2x6etoee+yxk0NgAZx33nl2xhlndGViOfP77//+7+3hhx/OyrnZ4vG67xzHyMiIXXTRRfblL3+5e63T6diXv/xlu/jii5eQshNQVZXdeOON9jd/8zf2la98xbZv356t88ADD5iZ2ebNmxeZunI4cuSIPfLII7Z582a76KKLbHh4uIfvDz/8sD3xxBPLhu+f+MQnbOPGjfazP/uzyXLLjdfbt2+3TZs29fD20KFDdt9993V5e/HFF9uBAwfs/vvv75b5yle+Yp1Op+sIlwLcaXz/+9+3u+++204//fRsnQceeMAGBgZmTQUtJTz11FP27LPPdmViufLb7Pms+qKLLrILL7wwW3bReL3oy++LAJ/97Ger0dHR6pOf/GT13e9+t7r++uur9evXV3v37l1q0qqqqqrf+I3fqNatW1fdc8891dNPP909jh07VlVVVe3Zs6d63/veV33rW9+qHn300eoLX/hCdd5551Wve93rlpTu3/3d363uueee6tFHH63+8R//sbr88surM844o3rmmWeqqqqqX//1X6/OOeec6itf+Ur1rW99q7r44ouriy++eElpdpiZmanOOeec6pZbbum5vlx4ffjw4eqf//mfq3/+53+uzKz64Ac/WP3zP/9zd/fR7bffXq1fv776whe+UH3nO9+p3vSmN1Xbt2+vjh8/3sVxxRVXVK94xSuq++67r/qHf/iH6sUvfnH11re+dcnonpqaqn7u536uOvvss6sHHnigR9YnJyerqqqqr3/969Wf/umfVg888ED1yCOPVJ/61KeqM888s/rVX/3VJaP78OHD1e/93u9Vu3fvrh599NHq7rvvrl75yldWL37xi6uJiYkujpPN75yMVFVVHTx4sFqzZk31kY98ZFb9k8nrvnQcVVVVf/Znf1adc8451cjISPWa17ym+sY3vrHUJHXBzOTxiU98oqqqqnriiSeq173uddWGDRuq0dHR6kUvelH1X/7Lf6kOHjy4pHT/0i/9UrV58+ZqZGSk+pEf+ZHql37pl6o9e/Z07x8/frz6zd/8zeq0006r1qxZU/38z/989fTTTy8hxSfg7/7u7yozqx5++OGe68uF11/96lelTFx77bVVVT2/Jffd7353ddZZZ1Wjo6PVZZddNqsvzz77bPXWt761esELXlCdeuqp1a/92q9Vhw8fXjK6H3300VDWv/rVr1ZVVVX3339/tWPHjmrdunXV2NhY9dKXvrT6b//tv/UY6JNN97Fjx6rXv/711ZlnnlkNDw9X5557bnXdddfNCjxPNr9zMlJVVfU//+f/rMbHx6sDBw7Mqn8yed28Vr2BBhpooIFa0HdrHA000EADDSwtNI6jgQYaaKCBWtA4jgYaaKCBBmpB4zgaaKCBBhqoBY3jaKCBBhpooBY0jqOBBhpooIFa0DiOBhpooIEGakHjOBpooIEGGqgFjeNooIEGGmigFjSOo4EGGmiggVrQOI4GGmiggQZqQeM4GmiggQYaqAX/P3/RJL2DEc95AAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 1500x1400 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# Test\n",
        "fig = plt.figure(figsize=(15,14))\n",
        "ax = fig.add_subplot(2, 3, 1)\n",
        "ax.imshow(recurrence_plot(x_train.values[25], steps=10), cmap='gray')\n",
        "d = recurrence_plot(x_train.values[25], steps=10)\n",
        "scaler = MinMaxScaler((-1, 1))\n",
        "x = scaler.fit_transform(d.reshape(187 * 187, 1))\n",
        "x"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 44,
      "metadata": {
        "id": "PxVriPG5tmu1"
      },
      "outputs": [],
      "source": [
        "y_train =train_df[187].values.astype(int)\n",
        "y_test = test_df[187].values.astype(int)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 45,
      "metadata": {
        "id": "3yAlxbDJtmu1"
      },
      "outputs": [],
      "source": [
        "# upsampling to reduce class imbalance\n",
        "smt2 = SMOTE(sampling_strategy={1: 30000, 2: 20000, 3: 20000, 4: 10000},random_state=42)\n",
        "x_train_2, y_train_2 = smt2.fit_resample(x_train, y_train)\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 46,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "9-2Q88bjtmu1",
        "outputId": "98173cf0-2dec-4d02-b156-e6cf79050585"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(87554, 187)"
            ]
          },
          "execution_count": 46,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_train.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 47,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "yHeAEWSptmu1",
        "outputId": "721213f0-bf3d-4a91-e657-eef4881cd85f"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(152471, 187)"
            ]
          },
          "execution_count": 47,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_train_2.shape"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "gasf = GramianAngularField(image_size=64, method='summation')\n",
        "x_gasf_train_2 = gasf.fit_transform(x_train_2)\n",
        "x_gasf_test_2 = gasf.transform(x_test)"
      ],
      "metadata": {
        "id": "YlV7ZgaIk33y"
      },
      "execution_count": 48,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "import gc\n",
        "del x_train_2, x_test  # Delete unused variables\n",
        "gc.collect()  # Free RAM\n"
      ],
      "metadata": {
        "id": "mmC1gQNf3g6U",
        "outputId": "789d271d-6a10-4fd2-f13a-0936d562f6bf",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "execution_count": 49,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "47999"
            ]
          },
          "metadata": {},
          "execution_count": 49
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 51,
      "metadata": {
        "id": "hV-JOESttmu1"
      },
      "outputs": [],
      "source": [
        "# create placeholders, then populate with images\n",
        "with h5py.File('hb_data_mit_bih_balanced_2.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_gasf_train_2), 224, 224), np.float32)  # 224, 224 for resnet\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_2),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_gasf_test_2), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_gasf_train_2, y_train_2)):\n",
        "        image = Image.fromarray(x.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, ...] = t\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_gasf_test_2, y_test)):\n",
        "        image = Image.fromarray(x.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, ...] = t\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "DC3YenGftmu1"
      },
      "outputs": [],
      "source": [
        "# upsampling to try with GramianAngularField method='difference'\n",
        "# results are almost same for both\n",
        "\n",
        "# Corrected SMOTE initialization (without n_jobs)\n",
        "smt3 = SMOTE(sampling_strategy={1: 30000, 2: 20000, 3: 20000, 4: 10000}, random_state=42)\n",
        "# Apply SMOTE\n",
        "x_train_3, y_train_3 = smt3.fit_resample(x_train, y_train)\n",
        "# Convert time series to Gramian Angular Field (GAF)\n",
        "gasf = GramianAngularField(image_size=64, method='difference')\n",
        "x_gasf_train_3 = gasf.fit_transform(x_train_3)\n",
        "x_gasf_test_3 = gasf.transform(x_test)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bTPnA_2Atmu1"
      },
      "outputs": [],
      "source": [
        "with h5py.File('hb_data_mit_bih_balanced_3.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_gasf_train_3), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_3),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_gasf_test_3), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_gasf_train_3, y_train_3)):\n",
        "        image = Image.fromarray(x.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, ...] = t\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_gasf_test_3, y_test)):\n",
        "        image = Image.fromarray(x.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, ...] = t\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "s3ervPDYtmu5"
      },
      "outputs": [],
      "source": [
        "with h5py.File('hb_data_mit_bih_balanced_rp.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_train_2), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_2),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_test), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_train_2.values, y_train_2)):\n",
        "        r = recurrence_plot(x, steps=10)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, ...] = t\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_test.values, y_test)):\n",
        "        r = recurrence_plot(x, steps=10)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, ...] = t\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "en6cPu_Qtmu5"
      },
      "outputs": [],
      "source": [
        "# Generating mixed hdf5: containing RP, GAF and mean of RP and GAF in 3 channels\n",
        "# Previous ones were single channel images\n",
        "with h5py.File('/media/asif/data/hb_data_mit_bih_balanced_mixed.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_train_3), 3, 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_3),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_test), 3, 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x1, x2, y) in enumerate(zip(x_gasf_train_3, x_train_3.values, y_train_3)):\n",
        "        image = Image.fromarray(x1.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        r = recurrence_plot(x2, steps=10)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t2 = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, 0, ...] = t\n",
        "        hdf5_file[\"x_train\"][i, 1, ...] = t2\n",
        "        hdf5_file[\"x_train\"][i, 2, ...] = (t + t2) / 2\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x1, x2, y) in enumerate(zip(x_gasf_test_3, x_test.values, y_test)):\n",
        "        image = Image.fromarray(x1.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        r = recurrence_plot(x2, steps=10)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t2 = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, 0, ...] = t\n",
        "        hdf5_file[\"x_test\"][i, 1, ...] = t2\n",
        "        hdf5_file[\"x_test\"][i, 2, ...] = (t + t2) / 2\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "wQB4wox-tmu5"
      },
      "outputs": [],
      "source": [
        "# Hearbeat values range from 0 to 1; we will divide into quantiles and see which bin each value belongs to\n",
        "# and what the probability is to transfer from 1 bin to other\n",
        "# i.e if 1 value is in bin 1 and the next value is in bin 5, what is the probability of transferring from\n",
        "# bin 1 to 5\n",
        "# correlation matrix of probabilities is markov transition field\n",
        "def get_quantiles(min_value=0, max_val=1, k=10):\n",
        "    c = (max_val - min_value)/k\n",
        "    b = min_value + c\n",
        "    d = []\n",
        "    for i in range(1, k):\n",
        "        d.append(b)\n",
        "        b += c\n",
        "    d.append(max_val)\n",
        "    return d\n",
        "\n",
        "quantiles = get_quantiles()\n",
        "\n",
        "def value_to_quantile(x):\n",
        "    for i, k in enumerate(quantiles):\n",
        "        if x <= k:\n",
        "            return i\n",
        "    return 0\n",
        "\n",
        "# qv_train = np.vectorize(value_to_quantile)(x_train_3.values)\n",
        "# qv_test = np.vectorize(value_to_quantile)(x_test.values)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Y7cLvbSntmu5"
      },
      "outputs": [],
      "source": [
        "def get_mtf(x, size=10):\n",
        "    q = np.vectorize(value_to_quantile)(x)\n",
        "    r = np.zeros((q.shape[0], q.shape[0]))\n",
        "    y = np.zeros((size, size))\n",
        "    for i in range(x.shape[0] - 1):\n",
        "        y[q[i], q[i + 1]] += 1\n",
        "    y = y / y.sum(axis=1, keepdims=True)\n",
        "    y[np.isnan(y)] = 0\n",
        "\n",
        "    for i in range(r.shape[0]):\n",
        "        for j in range(r.shape[1]):\n",
        "            r[i, j] = y[q[i], q[j]]\n",
        "    return r / 5. - 1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "MCnVdQO_tmu5",
        "outputId": "5b8e8c2b-0930-4a9c-fd78-99384f3ab20d"
      },
      "outputs": [
        {
          "ename": "NameError",
          "evalue": "name 'x_train_3' is not defined",
          "output_type": "error",
          "traceback": [
            "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
            "\u001b[1;32m<ipython-input-34-9f0902006b4f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m# MTF for 1 image\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mget_mtf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_train_3\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
            "\u001b[1;31mNameError\u001b[0m: name 'x_train_3' is not defined"
          ]
        }
      ],
      "source": [
        "# MTF for 1 image\n",
        "get_mtf(x_train_3.values[0])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "_gZvNBtftmu5"
      },
      "outputs": [],
      "source": [
        "plt.imshow(get_mtf(x_train_3.values[0]), cmap='gray', origin='lower')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "7WtZ0Q8ttmu5"
      },
      "outputs": [],
      "source": [
        "np.seterr(divide='ignore', invalid='ignore')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "uIQ1f35btmu5"
      },
      "outputs": [],
      "source": [
        "smt3 = SMOTE(sampling_strategy={1: 30000, 2: 20000, 3: 20000, 4: 10000}, n_jobs=-1, random_state=42)\n",
        "x_train_3, y_train_3 = smt3.fit_sample(x_train, y_train)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "EYJlA32Vtmu5"
      },
      "outputs": [],
      "source": [
        "with h5py.File('/media/asif/data/hb_data_mit_bih_balanced_mtf.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_train_3), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_3),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_test), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_train_3.values, y_train_3)):\n",
        "        mtf = get_mtf(x)\n",
        "        image = Image.fromarray(mtf.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, ...] = t\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_test.values, y_test)):\n",
        "        mtf = get_mtf(x)\n",
        "        image = Image.fromarray(mtf.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, ...] = t\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "RcCmd0Pstmu5"
      },
      "outputs": [],
      "source": [
        "# 3 channels, this time with GAF, RP and MTF\n",
        "with h5py.File('/media/asif/data/hb_data_mit_bih_balanced_gaf_rp_mtf.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_train_3), 3, 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_3),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_test), 3, 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x1, x2, y) in enumerate(zip(x_gasf_train_3, x_train_3.values, y_train_3)):\n",
        "        image = Image.fromarray(x1.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        r = recurrence_plot(x2, steps=10)\n",
        "        mtf = get_mtf(x2)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t2 = np.array(transform(image))\n",
        "        image = Image.fromarray(mtf.astype(float))\n",
        "        t3 = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, 0, ...] = t\n",
        "        hdf5_file[\"x_train\"][i, 1, ...] = t2\n",
        "        hdf5_file[\"x_train\"][i, 2, ...] = t3\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x1, x2, y) in enumerate(zip(x_gasf_test_3, x_test.values, y_test)):\n",
        "        image = Image.fromarray(x1.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        r = recurrence_plot(x2, steps=10)\n",
        "        mtf = get_mtf(x2)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t2 = np.array(transform(image))\n",
        "        image = Image.fromarray(mtf.astype(float))\n",
        "        t3 = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, 0, ...] = t\n",
        "        hdf5_file[\"x_test\"][i, 1, ...] = t2\n",
        "        hdf5_file[\"x_test\"][i, 2, ...] = t3\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.4"
    },
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "accelerator": "GPU"
  },
  "nbformat": 4,
  "nbformat_minor": 0
}